package cron

import (
	cron "github.com/robfig/cron/v3"
)

type  CronConfig struct {
	Spec string
	FuncName string
}


type  Cron struct {
	Cron  *cron.Cron
	CronMap map[cron.EntryID]CronConfig
	CronFun map[string]func()
}



var asd =cron.NewParser(cron.Second | cron.Minute |cron.Hour |cron.Dom |cron.Month | cron.Dow)

func New() *Cron{
	c := &Cron{
		Cron:      cron.New(),
		CronMap:      make(map[cron.EntryID]CronConfig),
		CronFun:  make(map[string]func()),
	}
	return c
}
func (c *Cron) RmAll()  {
	if len(c.CronMap)>0 {
		for id,_:= range c.CronMap {
			delete(c.CronMap, id)
			c.Cron.Remove(id)
		}
	}
}

func (c *Cron) AddFun(name string,f func()){
	c.CronFun[name]=f
}

func (c *Cron) AddAll(cons []CronConfig)error{
	c.Cron.Stop()
	c.RmAll()
	for _,con := range cons {
		if c.CronFun[con.FuncName] == nil {
			continue
		}
		sec, er :=asd.Parse(con.Spec)
		if er !=nil {
			return er
		}
		id :=c.Cron.Schedule(sec,cron.FuncJob(c.CronFun[con.FuncName]))
		c.CronMap[id]=con
	}
	c.Cron.Start()
	return nil
}
